/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package starfox.personagens;

import java.util.Iterator;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;

/**
 *
 * @author Lucas
 */

//O chefe é composto por 3 partes: a cabeça e as duas mãos, cada uma executando uma ação diferente
public class Andross {
    AndrossCabeca andc;
    AndrossMaoEsquerda andme;
    AndrossMaoDireita andmd;

    //Som de explosão
    Sound explosao = null;

    //Tiros para verificar se houve colisão
    TiroPersonagem tp = null;
    Tile tile = null;
    TiroInimigo3 tme = null;
    TiroInimigo3 tmd = null;

    //Verificar se ele está vivo. Se não estiver, o jogo acaba.
    boolean vivo = true;
    //Verificar se ele está pausado
    boolean paused = false;
    
    //Quanto de pontos deve ser aumentado para a Arwing quando a cabeça toma tiro
    int aumentoPontuacao = 50;

    public Andross() throws SlickException{
        andc = new AndrossCabeca();
        andme = new AndrossMaoEsquerda(andc);
        andmd = new AndrossMaoDireita(andc);
        explosao = new Sound("music/explosion-02.wav");
    }

    public boolean isVivo(){
        return vivo;
    }

    //Desenhar a cabeça, que é a parte principal, e as mãos, caso estejam "vivas"
    public void render(){
        andc.render();
        if(andme != null)
            andme.render();
        if(andmd != null)
            andmd.render();
    }

    //Verificar colisão dos tiros com a Arwing ou dos tiros da Arwing com o corpo
    public void colisao(Arwing arw){
        //Percorrer o ArrayList de tiros do personagem, verificando se colidem com a cabeça ou as mãos
        for(Iterator<TiroPersonagem> it = arw.getTiros().iterator(); it.hasNext();){
            tp = it.next();
            if(tp.getCaixaColisao().colisao(andc.getCaixaColisao())){
                //Se a cabeça tiver mais de 1 vida, diminuir normalmente
                if(andc.getVidas() > 1){
                    andc.diminuirVidas();
                    arw.aumentarPontuacao(aumentoPontuacao);
                }
                //Senão, esperar as mãos serem destruídas para destruir a cabeça
                else{
                    if(andme == null && andmd == null)
                        andc.diminuirVidas();
                }
                it.remove();
            }
            /*Se as mãos estiverem "vivas" e um tiro do personagem as atingir,
             * diminuir a quantidade de vidas e aumentar a pontuação do personagem.*/
            if(andme != null){
                if(tp.getCaixaColisao().colisao(andme.getCaixaColisao())){
                    andme.diminuirVidas();
                    arw.aumentarPontuacao(50);
                    it.remove();
                }
            }
            if(andmd != null){
                if(tp.getCaixaColisao().colisao(andmd.getCaixaColisao())){
                    andmd.diminuirVidas();
                    arw.aumentarPontuacao(50);
                    it.remove();
                }
            }
        }
        //Verificar colisão dos tiros da cabeça com a Arwing
        for(Iterator<Tile> iti = andc.getTiles().iterator(); iti.hasNext();){
            tile = iti.next();
            if(tile.getCaixaColisao().colisao(arw.getCaixaColisao()) && arw.isCollidable()){
                    arw.setCollidable(false);
                    arw.diminuiVidas();
                    iti.remove();
            }
        }
        //Se as mãos ainda estiverem lá, verificar a colisão dos tiros com a Arwing
        if(andme != null){
            for(Iterator<TiroInimigo3> it3 = andme.getTiros().iterator(); it3.hasNext();){
                    tme = it3.next();
                    if(tme.getCaixaColisao().colisao(arw.getCaixaColisao()) && arw.isCollidable()){
                        arw.setCollidable(false);
                        arw.diminuiVidas();
                        it3.remove();
                    }
            }
        }
        if(andmd != null){
            for(Iterator<TiroInimigo3> it4 = andmd.getTiros().iterator(); it4.hasNext();){
                    tmd = it4.next();
                    if(tmd.getCaixaColisao().colisao(arw.getCaixaColisao()) && arw.isCollidable()){
                        arw.setCollidable(false);
                        arw.diminuiVidas();
                        it4.remove();
                    }
            }
        }
    }

    public void update(int delta, Arwing arw) throws SlickException{
        if(vivo){
            //Se a cabeça estiver com metade das vidas, tocar som de explosão
            if(andc.getVidas() == 25){
                aumentoPontuacao = 75;
                if(!explosao.playing()) explosao.play();
            }
            //Se não houver mais vidas, o chefe morre
            if(andc.getVidas() == 0){
                vivo = false;
                //Bônus para quanto de vida a nave ainda tem
                arw.aumentarPontuacao(arw.getVidas()*100);
            }

            //Atualizar a cabeça
            andc.update(delta, arw);

            //Atualizar a mão esquerda, se estiver lá
            if(andme != null){
                andme.update(delta, andc, arw);
                //Se estiver sem vidas, a mão some
                if(andme.getVidas() == 0){
                    explosao.play();
                    arw.aumentarPontuacao(200);
                    andme = null;
                }
            }

            //Atualizar a mão direita, se estiver lá
            if(andmd != null){
                andmd.update(delta, andc, arw);
                //Se estiver sem vidas, a mão some
                if(andmd.getVidas() == 0){
                    explosao.play();
                    arw.aumentarPontuacao(200);
                    andmd = null;
                }
            }

            //Checar colisão com as partes do chefe
            colisao(arw);
        }
    }
}